/*
 ============================================================================
 Name        : XInt32.cpp
 Author      : 
 Version     :
 Copyright   : Your copyright notice
 Description : CXTInt implementation
 ============================================================================
 */

#include "XInt32.h"

XInt32::XInt32()
{
    m_nBase = 0;
    m_cMul = 0;
}

XInt32::XInt32(const XInt32& x)
{
    m_nBase = x.m_nBase;
    m_cMul = x.m_cMul;
}

XInt32::XInt32(const TInt64 n)
{
    *this = n;
}

TInt64 XInt32::GetValue() const
{
    TInt64 n = m_nBase;

    for (TInt c = 0; c < m_cMul; c++)
        n *= 16;

    return n;
}

XInt32& XInt32::operator=(const XInt32& x)
{
    m_nBase = x.m_nBase;
    m_cMul = x.m_cMul;

    return *this;
}

XInt32 XInt32::operator+=(const TInt64 n)
{
    //	*this = *this+n;
    *this = GetValue() + n;
    return *this;
}

TInt XInt32::GetRawData() const
{
    return *((TInt*) this);
    //return m_nValue;
}

void XInt32::SetRawData(TInt n)
{
    *(TInt*) this = n;
}

XInt32 XInt32::operator=(const TInt64 n)
{
    TInt64 nBase = n;
    m_cMul = 0;

    TInt nMod = 0;

    while (nBase > XInt32m_nMaxBase || nBase < XInt32m_nMinBase)
    {
#ifdef __SERIES60_3X__
        nMod = (nBase % 16);
#else
        nMod = (nBase % 16).GetTInt();
#endif
        nBase /= 16;

        if (nMod >= 8)
            nBase++;
        else if (nMod <= -8)
            nBase--;

        m_cMul++;
        if (m_cMul >= XInt32m_cMaxMul)
            break;
    }
#ifdef __SERIES60_3X__
    m_nBase = nBase;
#else
    m_nBase = nBase.GetTInt();
#endif

    return *this;
}

TBool XInt32::operator==(XInt32 x)
{
    TInt64 n64 = *this;
    TInt64 nX = x;
    return (n64 == nX);
}
